package com.example.designpatterns.proxy;

/**
 * ProxyImage类 - 代理类，实现了Image接口
 * 控制对RealImage的访问，实现懒加载、访问控制等功能
 */
public class ProxyImage implements Image {
    private String filename;
    private long size;
    private RealImage realImage;
    
    /**
     * 创建代理对象时，不会立即创建RealImage对象
     * @param filename 图像文件名
     */
    public ProxyImage(String filename) {
        this.filename = filename;
        this.size = calculateImageSizeEstimate(filename);
        System.out.println("创建图像代理：" + filename + "（预估大小：" + size + " KB）");
    }
    
    /**
     * 模拟预估图像大小，不需要加载实际图像
     * @param filename 图像文件名
     * @return 预估的文件大小（KB）
     */
    private long calculateImageSizeEstimate(String filename) {
        // 与RealImage中的计算方法相同，但在实际应用中可能只是一个粗略估计
        return filename.length() * 50 + 100;
    }
    
    /**
     * 获取或创建真实图像对象
     * @return 真实图像对象
     */
    private RealImage getRealImage() {
        if (realImage == null) {
            System.out.println("通过代理首次访问图像，开始加载实际图像...");
            realImage = new RealImage(filename);
        }
        return realImage;
    }
    
    @Override
    public void display() {
        // 只有在需要显示图像时才会加载真实图像
        getRealImage().display();
    }
    
    @Override
    public String getFilename() {
        // 不需要加载真实图像就可以获取文件名
        return filename;
    }
    
    @Override
    public long getSize() {
        // 可以提供预估大小，不必加载真实图像
        // 如果已经加载了真实图像，就返回真实大小
        if (realImage != null) {
            return realImage.getSize();
        }
        return size;
    }
    
    /**
     * 检查图像是否已加载
     * @return 是否已加载真实图像
     */
    public boolean isImageLoaded() {
        return realImage != null;
    }
} 